﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SCEM.DataLayer;
using SCEM.DTO;
using SCEM.ControleEstoque;
using SCEM.CompraProdutos;
using SCEM.Manutencao;
using SCEM.CompraEquipamentos;

namespace SCEM.Services
{
    public class SCEMService : ISCEM
    {
        #region CRUD Produto

        public ProdutoDTO SaveProduto(ProdutoDTO produtoDTO)
        {
            if (produtoDTO == null)
                return null;

            ProdutoDAO produtoDAO = new ProdutoDAO();
            return (ProdutoDTO)produtoDAO.Save(produtoDTO);
        }

        public ProdutoDTO UpdateProduto(ProdutoDTO produtoDTO)
        {
            if (produtoDTO == null)
                return null;

            ProdutoDAO produtoDAO = new ProdutoDAO();
            return (ProdutoDTO)produtoDAO.Update(produtoDTO);
        }

        public ProdutoDTO GetProduto(string idProduto)
        {
            if (String.IsNullOrEmpty(idProduto))
                return null;

            ProdutoDAO produtoDAO = new ProdutoDAO();
            return (ProdutoDTO)produtoDAO.Get(idProduto);
        }

        public List<ProdutoDTO> GetProdutos(int pageNumber, int resultsPerPage, bool includeDisabledEntities)
        {
            ProdutoDAO produtoDAO = new ProdutoDAO();
            List<IDTO<Produto>> listaIDTO = produtoDAO.GetAll(pageNumber, resultsPerPage, includeDisabledEntities);
            List<ProdutoDTO> listaRetorno = new List<ProdutoDTO>();

            foreach (IDTO<Produto> item in listaIDTO)
                listaRetorno.Add((ProdutoDTO)item);
            return listaRetorno;
        }

        public int GetTotalProdutos(bool includeDisabledEntities)
        {
            ProdutoDAO produtoDAO = new ProdutoDAO();
            return produtoDAO.GetTotalEntities(includeDisabledEntities);
        }

        public bool DisableProduto(string idProduto)
        {
            if (String.IsNullOrEmpty(idProduto))
                return false;

            ProdutoDAO produtoDAO = new ProdutoDAO();
            return produtoDAO.Disable(idProduto);
        }

        #endregion

        #region Listagem de TipoProduto

        public List<TipoProdutoDTO> ListarTiposProdutos()
        {
            List<TipoProduto> listaEntidade = new List<TipoProduto>();
            List<TipoProdutoDTO> listaDTO = new List<TipoProdutoDTO>();
            
            using (var context = new SCEMContainer())
                listaEntidade = context.TiposProdutos.ToList();

            foreach (TipoProduto entidade in listaEntidade)
                listaDTO.Add(new TipoProdutoDTO(entidade));

            return listaDTO;
        }

        #endregion

        #region Listagem de TipoFisioterapia

        /// <summary>
        /// Busca e retorna a lista de todos os tipos de fisioterapia cadastrados no sistema.
        /// </summary>
        /// <returns>A lista de todos os tipos de fisioterapia cadastrados no sistema.</returns>
        public List<TipoFisioterapiaDTO> ListarTiposFisioterapia()
        {
            List<TipoFisioterapia> listaEntidade = new List<TipoFisioterapia>();
            List<TipoFisioterapiaDTO> listaDTO = new List<TipoFisioterapiaDTO>();

            using (var context = new SCEMContainer())
                listaEntidade = context.TiposFisioterapia.ToList();

            foreach (TipoFisioterapia entidade in listaEntidade)
                listaDTO.Add(new TipoFisioterapiaDTO(entidade));

            return listaDTO;
        }

        #endregion

        #region CRUD Fornecedor

        public FornecedorDTO SaveFornecedor(FornecedorDTO fornecedorDTO)
        {
            if (fornecedorDTO == null)
                return null;

            FornecedorDAO fornecedorDAO = new FornecedorDAO();
            return (FornecedorDTO)fornecedorDAO.Save(fornecedorDTO);
        }

        public FornecedorDTO UpdateFornecedor(FornecedorDTO fornecedorDTO)
        {
            if (fornecedorDTO == null)
                return null;

            FornecedorDAO fornecedorDAO = new FornecedorDAO();
            return (FornecedorDTO)fornecedorDAO.Update(fornecedorDTO);
        }

        public FornecedorDTO GetFornecedor(string idFornecedor)
        {
            if (String.IsNullOrEmpty(idFornecedor))
                return null;

            FornecedorDAO fornecedorDAO = new FornecedorDAO();
            return (FornecedorDTO)fornecedorDAO.Get(idFornecedor);
        }

        public List<FornecedorDTO> GetFornecedores(int pageNumber, int resultsPerPage, bool includeDisabledEntities)
        {
            FornecedorDAO fornecedorDAO = new FornecedorDAO();
            List<IDTO<Fornecedor>> listaIDTO = fornecedorDAO.GetAll(pageNumber, resultsPerPage, includeDisabledEntities);
            List<FornecedorDTO> listaRetorno = new List<FornecedorDTO>();

            foreach (IDTO<Fornecedor> item in listaIDTO)
                listaRetorno.Add((FornecedorDTO)item);
            return listaRetorno;
        }

        public int GetTotalFornecedores(bool includeDisabledEntities)
        {
            FornecedorDAO fornecedorDAO = new FornecedorDAO();
            return fornecedorDAO.GetTotalEntities(includeDisabledEntities);
        }

        public bool DisableFornecedor(string idFornecedor)
        {
            if (String.IsNullOrEmpty(idFornecedor))
                return false;

            FornecedorDAO fornecedorDAO = new FornecedorDAO();
            return fornecedorDAO.Disable(idFornecedor);
        }

        #endregion

        #region CRUD Equipamento

        public EquipamentoDTO SaveEquipamento(EquipamentoDTO equipamentoDTO)
        {
            if (equipamentoDTO == null)
                return null;

            EquipamentoDAO equipamentoDAO = new EquipamentoDAO();
            return (EquipamentoDTO)equipamentoDAO.Save(equipamentoDTO);
        }

        public EquipamentoDTO UpdateEquipamento(EquipamentoDTO equipamentoDTO)
        {
            if (equipamentoDTO == null)
                return null;

            EquipamentoDAO equipamentoDAO = new EquipamentoDAO();
            return (EquipamentoDTO)equipamentoDAO.Update(equipamentoDTO);
        }

        public EquipamentoDTO GetEquipamento(string idEquipamento)
        {
            if (String.IsNullOrEmpty(idEquipamento))
                return null;

            EquipamentoDAO equipamentoDAO = new EquipamentoDAO();
            return (EquipamentoDTO)equipamentoDAO.Get(idEquipamento);
        }

        public List<EquipamentoDTO> GetEquipamentos(int pageNumber, int resultsPerPage, bool includeDisabledEntities)
        {
            EquipamentoDAO equipamentoDAO = new EquipamentoDAO();
            List<IDTO<Equipamento>> listaIDTO = equipamentoDAO.GetAll(pageNumber, resultsPerPage, includeDisabledEntities);
            List<EquipamentoDTO> listaRetorno = new List<EquipamentoDTO>();

            foreach (IDTO<Equipamento> item in listaIDTO)
                listaRetorno.Add((EquipamentoDTO)item);
            return listaRetorno;
        }

        public int GetTotalEquipamentos(bool includeDisabledEntities)
        {
            EquipamentoDAO equipamentoDAO = new EquipamentoDAO();
            return equipamentoDAO.GetTotalEntities(includeDisabledEntities);
        }

        public bool DisableEquipamento(string idEquipamento)
        {
            if (String.IsNullOrEmpty(idEquipamento))
                return false;

            EquipamentoDAO equipamentoDAO = new EquipamentoDAO();
            return equipamentoDAO.Disable(idEquipamento);
        }

        #endregion

        #region Controle Estoque

        public int InsereProdutoEstoque(string idProduto, int quantidade)
        {
            EstoqueControle estoque = new EstoqueControle();
            return estoque.InsereProdutoEstoque(idProduto, quantidade);
        }

        public int RetiraProdutoEstoque(string idProduto, int quantidade)
        {
            EstoqueControle estoque = new EstoqueControle();
            return estoque.RetiraProdutoEstoque(idProduto, quantidade);
        }

        public List<ProdutoDTO> ListaProdutosAlerta(int pageNumber, int resultsPerPage)
        {
            EstoqueControle estoque = new EstoqueControle();
            return estoque.ListaProdutosAlerta(pageNumber, resultsPerPage);
        }

        public List<ProdutoDTO> ListaProdutosEstoque(int pageNumber, int resultsPerPage)
        {
            EstoqueControle estoque = new EstoqueControle();
            return estoque.ListaProdutosEstoque(pageNumber, resultsPerPage);
        }

        public bool VerificaDisponibilidadeProduto(string idProduto)
        {
            EstoqueControle estoque = new EstoqueControle();
            return estoque.VerificaDisponibilidadeProduto(idProduto);
        }

        public List<HistoricoEstoqueDTO> BuscarHistoricoProdutos(string idProduto, DateTime dataInicio, DateTime dataFim, int pageNumber, int resultsPerPage)
        {
            EstoqueControle estoque = new EstoqueControle();
            return estoque.BuscarHistoricoProdutos(idProduto, dataInicio, dataFim, pageNumber, resultsPerPage);
        }

        #endregion

        #region Compra Produtos

        public CondicaoVendaDTO SaveCondicaoVenda(CondicaoVendaDTO dto)
        {
            if (dto == null)
                return null;

            CondicaoVendaDAO dao = new CondicaoVendaDAO();
            return (CondicaoVendaDTO)dao.Save(dto);
        }

        public CondicaoVendaDTO UpdateCondicaoVenda(CondicaoVendaDTO dto)
        {
            if (dto == null)
                return null;

            ICondicaoVendaDAO dao = new CondicaoVendaDAO();
            return (CondicaoVendaDTO)dao.Update(dto);
        }

        public bool DeleteCondicaoVenda(string idProduto, string idFornecedor)
        {
            ICondicaoVendaDAO dao = new CondicaoVendaDAO();
            return dao.Delete(idProduto, idFornecedor);
        }

        public CondicaoVendaDTO GetCondicaoVenda(string idProduto, string idFornecedor)
        {
            ICondicaoVendaDAO dao = new CondicaoVendaDAO();
            return (CondicaoVendaDTO)dao.Get(idProduto, idFornecedor);
        }

        public List<CondicaoVendaDTO> GetAllCondicoesVenda(string idProduto)
        {
            ICondicaoVendaDAO dao = new CondicaoVendaDAO();
            return dao.GetAll(idProduto);
        }

        public OrdemCompraProdutoDTO CreateOrdemCompraProduto(OrdemCompraProdutoDTO dto)
        {
            GerenciadorCompraProdutos gerenciador = new GerenciadorCompraProdutos();
            return gerenciador.CreateOrdemCompraProduto(dto);
        }

        public bool UpdateOrdemCompraProdutoStatus(string idOrdemCompraProduto, StatusOrdemCompra novoStatus)
        {
            GerenciadorCompraProdutos gerenciador = new GerenciadorCompraProdutos();
            return gerenciador.UpdateOrdemCompraProdutoStatus(idOrdemCompraProduto, novoStatus);
        }

        #endregion

        #region Compra Equipamentos

        public OrdemCompraEquipamentoDTO CreateOrdemCompraEquipamento(OrdemCompraEquipamentoDTO dto, EquipamentoDTO equipamentoDTO)
        {
            GerenciadorCompraEquipamento gerenciador = new GerenciadorCompraEquipamento();
            return gerenciador.CreateOrdemCompraEquipamento(dto, equipamentoDTO);
        }

        public bool UpdateOrdemCompraEquipamentoStatus(string idOrdemCompraEquipamento, StatusOrdemCompra novoStatus)
        {
            GerenciadorCompraEquipamento gerenciador = new GerenciadorCompraEquipamento();
            return gerenciador.UpdateOrdemCompraEquipamentoStatus(idOrdemCompraEquipamento, novoStatus);
        }

        #endregion

        #region Manutencao

        public int VerificarQuantidadeEquipamentosDisponiveis(string tipoFisioterapiaId, DateTime diaConsulta)
        {
            GerenciadorManutencao gerenciador = new GerenciadorManutencao();
            return gerenciador.VerificarQuantidadeEquipamentosDisponiveis(tipoFisioterapiaId, diaConsulta);
        }

        public List<EquipamentoDTO> ListarEquipamentosAlertaManutencao()
        {
            GerenciadorManutencao gerenciador = new GerenciadorManutencao();
            return gerenciador.ListarEquipamentosAlertaManutencao();
        }

        public List<EquipamentoDTO> ListarEquipamentosManutencaoPreventinaAgendada()
        {
            GerenciadorManutencao gerenciador = new GerenciadorManutencao();
            return gerenciador.ListarEquipamentosManutencaoPreventinaAgendada();
        }

        public bool AgendarManutencaoPreventiva(string equipamentoId, DateTime dataManutencao)
        {
            GerenciadorManutencao gerenciador = new GerenciadorManutencao();
            return gerenciador.AgendarManutencaoPreventiva(equipamentoId, dataManutencao);
        }

        public bool ArquivarManutencaoPreventiva(string equipamentoId, string descricao)
        {
            GerenciadorManutencao gerenciador = new GerenciadorManutencao();
            return gerenciador.ArquivarManutencaoPreventiva(equipamentoId, descricao);
        }

        #endregion

    }
}
